package fr.greta.centreFormation.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import fr.greta.centreFormation.bean.Candidat;
import fr.greta.centreFormation.bean.Etat;

/**
 * EtatHome est la classe regroupant les methodes d'acces a la base de donnees
 * concernant les Etats d'une candidature
 * 
 * @author dgidgib
 * 
 */
public class EtatHome {

	/**
	 * retourne tous les Etats
	 * 
	 * @return une ArrayList de tous les Etat
	 */
	public static ArrayList<Etat> selectAllEtats() {
		ArrayList<Etat> allEtats = new ArrayList<Etat>();

		String select = "SELECT * FROM etat";

		try {
			Connection connection = Bdd.getConnection();
			PreparedStatement stmt = connection.prepareStatement(select);
			ResultSet resultat = stmt.executeQuery();

			while (resultat.next()) {
				Etat etat = new Etat();
				etat.setIdEtat(resultat.getInt("id_etat"));
				etat.setNom(resultat.getString("nom_etat"));
				etat.setDescription(resultat.getString("description_etat"));
				allEtats.add(etat);
			}

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return allEtats;
	}

	/**
	 * retourne un Etat par son IdEtat
	 * 
	 * @param idEtat
	 *            l'Id de l'Etat
	 * @return un Etat
	 */
	public static Etat selectUnEtatByIdEtat(int idEtat) {

		Etat etat = new Etat();

		String select = "SELECT * FROM etat WHERE id_etat = ?";

		try {
			Connection connection = Bdd.getConnection();
			PreparedStatement stmt = connection.prepareStatement(select);
			stmt.setInt(1, idEtat);
			ResultSet resultat = stmt.executeQuery();
			resultat.next();

			etat.setIdEtat(resultat.getInt(1));
			etat.setNom(resultat.getString(2));
			etat.setDescription(resultat.getString(3));

			return etat;

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}

	}

	/**
	 * retourne un Etat selon son nom
	 * 
	 * @param nom
	 *            le nom de l'Etat
	 * @return un etat
	 */
	public static Etat selectUnEtatByNom(String nom) {
		Etat etat = new Etat();

		String select = "SELECT * FROM etat WHERE nom_etat='" + nom + "'";
		System.out.println(select);

		try {
			Connection connection = Bdd.getConnection();
			PreparedStatement stmt = connection.prepareStatement(select);
			ResultSet resultat = stmt.executeQuery();
			resultat.next();
			// etat.setIdEtat(resultat.getInt(1));
			etat.setNom(resultat.getString(2));
			etat.setDescription(resultat.getString(3));
			System.out.println("c'est effectuer");
			return etat;

		} catch (SQLException e) {

			System.out.println(e);
			return null;
		}
	}

	/**
	 * retourne l'Etat d'un Candidat
	 * 
	 * @param unCandidat
	 *            le candidat sélectionné
	 * @return un Etat
	 */
	public static Etat selectUnEtatByCandidat(Candidat unCandidat) {
		int idCandidat = CandidatHome.selectIdCandidatByIdPersonne(unCandidat
				.getIdPersonne());
		String sql = "SELECT * FROM etat e INNER JOIN candidat c ON c.id_etat=e.id_etat WHERE c.id_candidat=?";

		try {
			Connection connection = Bdd.getConnection();
			PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setInt(1, idCandidat);
			ResultSet result = stmt.executeQuery();

			result.next();
			Etat unEtat = new Etat();

			unEtat.setIdEtat(result.getInt("id_etat"));
			unEtat.setNom(result.getString("nom_etat"));
			unEtat.setDescription(result.getString("description_etat"));

			return unEtat;

		} catch (SQLException e) {

			e.printStackTrace();
			return null;
		}

	}

	/**
	 * retourne un Etat selon l'Id du candidat
	 * 
	 * @param idCandidat
	 *            l'id du Candidat
	 * @return un Etat
	 */
	public static Etat selectUnEtatByIdCandidat(int idCandidat) {

		String sql = "SELECT * FROM etat e INNER JOIN candidat c ON c.id_etat=e.id_etat WHERE c.id_candidat=?";

		try {
			Connection connection = Bdd.getConnection();
			PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setInt(1, idCandidat);
			ResultSet result = stmt.executeQuery();

			result.next();
			Etat unEtat = new Etat();

			unEtat.setIdEtat(result.getInt("id_etat"));
			unEtat.setNom(result.getString("nom_etat"));
			unEtat.setDescription(result.getString("description_etat"));

			return unEtat;

		} catch (SQLException e) {

			e.printStackTrace();
			return null;
		}

	}

	/**
	 * retourne l'id de l'Etat insere
	 * 
	 * @param unEtat	l'Etat à insérer
	 * @return			l'idEtat
	 */
	public static int insertUnEtat(Etat unEtat) {
		int idEtat = 0;
		String nomEtat = unEtat.getNom();
		String descritionEtat = unEtat.getDescription();

		String insert = "INSERT INTO etat(nom_Etat, description_Etat)VALUES (?,?)";

		try {
			Connection connection = Bdd.getConnection();
			PreparedStatement stmt = connection.prepareStatement(insert,
					Statement.RETURN_GENERATED_KEYS);
			stmt.setString(1, nomEtat);
			stmt.setString(2, descritionEtat);

			stmt.executeUpdate();

			ResultSet result = stmt.getGeneratedKeys();
			result.next();
			idEtat = result.getInt(1);
			return idEtat;

		} catch (SQLException e) {
			System.out.println(e.getMessage());
			return 0;
		}

	}

	/**
	 * retourne true si la suppresion s'est bien déroulee, false dans le cas contraire
	 * 
	 * 
	 * @param idEtat	l'id de l'Etat
	 * @return			true ou false suivant le deroulement de la suppression
	 */
	public static boolean deleteUnEtat(int idEtat) {

		String delete = "DELETE FROM etat WHERE id_Etat=?";

		try {
			Connection connection = Bdd.getConnection();
			PreparedStatement stmt = connection.prepareStatement(delete);

			stmt.setInt(1, idEtat);
			stmt.executeUpdate();

			return true;

		} catch (SQLException e) {
			e.getMessage();
			return false;

		}

	}


	/**
	 * retourne true si la mise a jour s'est correctement deroule, false dans le cas contraire
	 * 
	 * @param unEtat	l'Etat a mettre à jour
	 * @return			true ou false suivant le deroulement de la mise a jour
	 */
	public static boolean updateUnEtat(Etat unEtat) {
		int idEtat = unEtat.getIdEtat();
		String nom = unEtat.getNom();
		String description = unEtat.getDescription();

		String update = "UPDATE etat SET nom_etat=?,description_etat=? WHERE id_Etat=?"
				+ idEtat + "'";

		try {
			Connection connection = Bdd.getConnection();
			PreparedStatement stmt = connection.prepareStatement(update);

			stmt.setString(1, nom);
			stmt.setString(2, description);
			stmt.setInt(3, idEtat);

			stmt.executeUpdate();

			return true;

		} catch (SQLException e) {
			e.getMessage();
			return false;
		}

	}
}
